package com.allwees.bs.module.mms.req.register;

import com.allwees.bs.core.modelbase.req.SignedReq;
import com.allwees.bs.core.modelbase.validate.ValidateItem;
import com.allwees.bs.module.core.constant.EWithdrawAccountChannel;
import com.allwees.bs.module.mms.entity.RetailerApply;
import com.allwees.core.common.constant.EPlatform;
import com.allwees.core.common.constant.EWithdrawAccountType;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Data
@EqualsAndHashCode(callSuper = true)
public class RetailerRegisterAccountReq extends SignedReq {

    private EPlatform platform;

    private String uuid;

    private EWithdrawAccountChannel channel;

    private EWithdrawAccountType accountType;

    private String legalPersonName;

    private String legalPersonIdCardNo;

    /** 公司名称 **/
    private String companyName;

    /** 公司统一社会信用码 **/
    private String uniformSocialCreditCode;

    /** 营业执照 **/
    private String businessLicenseImg;

    //================== 账户 ============
    private String accountNo;
    private String bankCode;
    private String bankName;
    private String bankProvince;
    private String bankCity;
    private String bankArea;
    private String branchBankLocation;
    private String branchBank;

    private String accountOwnerName;
    private String accountOwnerIdNo;

    private EWithdrawAccountType merchantType;

    @Override
    protected Object[] signValues() {
        if(EWithdrawAccountType.COMPANY.equals(merchantType)){
            return new Object[]{platform.name(), uuid, companyName, uniformSocialCreditCode, legalPersonName, legalPersonIdCardNo, time.getTime()};
        } else {
            return new Object[]{platform.name(), uuid, legalPersonName, legalPersonIdCardNo, time.getTime()};
        }
    }

    @Override
    protected String signSeparator() {
        return platform.isApp() ? "_AS_" : "_PC_";
    }

    @Override
    public ValidateItem[] getValidateItems() {
        //companyName uniformSocialCreditCode legalPersonName legalPersonIdCardNo
        return ArrayUtils.addAll(
                super.getValidateItems(),
                customValidateItems());
    }

    public ValidateItem[] customValidateItems() {
        List<ValidateItem> validateItems = new ArrayList<>();
        validateItems.add(ValidateItem.of(StringUtils.isEmpty(uuid), "uuid 不能为空"));
        validateItems.add(ValidateItem.of(merchantType == null, "商户类型不能为空"));
        validateItems.add(ValidateItem.of(accountType == null, "账户类型不能为空"));
        validateItems.add(ValidateItem.of(channel == null, "体现类型不能为空"));

        if (EWithdrawAccountChannel.PAYBY.equals(channel)) {
            validateItems.add(ValidateItem.of(StringUtils.isEmpty(accountNo), "收款账户不能为空"));
        } else {
            if(EWithdrawAccountType.COMPANY.equals(merchantType)){
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(companyName), "公司名称不能为空"));
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(uniformSocialCreditCode), "统一社会信用码不能为空"));
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(businessLicenseImg), "营业执照不能为空"));
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(legalPersonName), "法人姓名不能为空"));
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(legalPersonIdCardNo), "法人身份证号不能为空"));
            } else {
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(legalPersonName), "店主姓名不能为空"));
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(legalPersonIdCardNo), "店主身份证号不能为空"));
            }

            if (EWithdrawAccountType.INDIVIDUAL.equals(accountType)) {
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(accountOwnerName), "收款人姓名不能为空"));
                validateItems.add(ValidateItem.of(StringUtils.isEmpty(accountOwnerIdNo), "收款人身份证号不能为空"));
                validateItems.add( ValidateItem.of(StringUtils.isEmpty(accountNo), "银行卡号不能为空"));
            }
            validateItems.addAll(Arrays.asList(
                    ValidateItem.of(StringUtils.isEmpty(bankName), "收款银行不能为空"),
                    ValidateItem.of(StringUtils.isEmpty(bankProvince), "开户行省份不能为空"),
                    ValidateItem.of(StringUtils.isEmpty(bankCity), "开户行城市不能为空"),
//                ValidateItem.of(StringUtils.isEmpty(bankArea), "开户行地区不完整"),
                    ValidateItem.of(StringUtils.isEmpty(branchBankLocation), "开户行地址不能为空")
                    ));
        }
        return validateItems.toArray(new ValidateItem[0]);
    }

    public RetailerApply toEntity() {
        RetailerApply apply = new RetailerApply();
        BeanUtils.copyProperties(this, apply);
        return apply;
    }
}

